/**
 *
 * 协程/纤程（Fiber）/绿色线程（GreenThread）
 *
 * 线程定义:操作系统产生一个进程，进程再产生若干个线程并行的处理逻辑，线程的切换由操作系统负责调度;
 * C++ Java等线程其实与操作系统线程是1:1的关系;
 * 每个线程都有自己的Stack，Java在64位系统默认Stack大小是1024KB;
 *
 * 例如:传统的J2EE系统都是基于每个请求占用一个线程去完成完整的业务逻辑（包括事务）。所以系统的吞吐能力取决于每个线程的操作耗时。
 *      如果遇到很耗时的I/O行为，则整个系统的吞吐立刻下降，比如***JDBC是同步阻塞***的，这也是为什么很多人都说数据库是瓶颈的原因。
 *      这里的耗时其实是让CPU一直在等待I/O返回，说白了线程根本没有利用CPU去做运算，而是处于空转状态。暴殄天物啊。
 *      另外过多的线程，也会带来更多的ContextSwitch开销。
 *
 * 问题：线程空转占用CPU资源
 *      比较流行的解决方案之一就是单线程加上异步回调
 *      但上述导致的问题：这时候执行的地方可能就不是你原来的代码区块了，
 *      具体表现在代码层面上，你会发现你的局部变量全部丢失，毕竟相关的栈已经被覆盖了，
 *      所以为了保存之前的栈上数据，你要么选择带着一起放入回调函数里，要么就不停的嵌套，从而引起反人类的Callback hell
 * 因此相关的Promise，CompletableFuture等技术都是为解决相关的问题而产生的。但是本质上还是不能解决业务逻辑的割裂。
 *
 * 协程的本质上其实还是和上面的方法一样，只不过他的核心点在于调度那块由他来负责解决，遇到阻塞操作，立刻yield掉，并且记录当前栈上的数据，
 * 阻塞完后立刻再找一个线程恢复栈并把阻塞的结果放到这个线程上去跑，这样看上去好像跟写同步代码没有任何差别，
 * 这整个流程可以称为coroutine，而跑在由coroutine负责调度的线程称为Fiber。
 * @date 2020/12/4
 */
package cn.jdemo.juc.quasar;